﻿// C. Build Permutation.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1713/C

如果对于所有有效索引 i（0≤i≤n-1），ai+i 都是完全平方，那么大小为 n 的 0 索引数组 a 称为良好数组。

给定一个整数 n，找出[0,1,2,...,n-1]中一个良好的排列‡ p，或确定不存在这样的排列。

如果存在一个整数 y，使得 x=y2 ，则称整数 x 为完全平方。

如果数组 b 是由数组 a 的元素按任意顺序排列而成，那么数组 b 就是数组 a 的排列。
例如，[4,2,3,4] 是 [3,2,4,4] 的排列，而 [1,2,2] 不是 [1,2,3] 的排列。

输入
第一行包含一个整数 t（1≤t≤104）--测试用例数。
每个测试用例的唯一一行包含一个整数 n（1≤n≤105）--置换 p 的长度。

保证所有测试用例的 n 之和不超过 105。

输出
对于每个测试用例，如果答案存在，则输出 n 个不同的整数 p0、p1......、pn-1（0≤pi≤n-1）--排列组合 p，否则输出-1。否则为-1。

InputCopy
3
3
4
7
OutputCopy
1 0 2
0 3 2 1
1 0 2 6 5 4 3

注释
在第一个测试案例中，我们有 n=3。数组 p=[1,0,2] 很好，因为 1+0=12，0+1=12，2+2=2^2。
在第二个测试案例中，我们有 n=4。数组 p=[0,3,2,1] 是好数组，因为 0+0=02，3+1=22，2+2=22，1+3=22。

*/

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;

const int N = 350;
int a[N];
int ans[100010];
int T;

void init() {
	for (int i = 0; i < N; i++) {
		a[i] = i * i;
	}
}

int find(int l, int r, int t) {
	while (l < r) {
		int mid = l + r >> 1;
		if (a[mid] >= t) r = mid;
		else l = mid + 1;
	}
	return a[l];
}

void solve() {
	int n; 
	//cin >> n;
	scanf("%d",&n);
	int len = n;
	n--;
	while (n >= 0) {
		int t = find(0, N-1, n);
		int limit = n;
		while (n >= 0 && (t - n) <= limit) {
			ans[t - n] = n;
			n--;
		}
	}

	for (int i = 0; i < len; i++) {
		//cout << ans[i] << " ";
		printf("%d ",ans[i]);
	}
	printf("\n");
}



int main()
{
	init();
	//cin >> T;
	scanf("%d",&T);
	while (T--) {
		solve();
	}
	return 0;
}
 